# -*- coding:utf-8 -*-

import httpx as base_request
from httpx._config import DEFAULT_TIMEOUT_CONFIG, Limits, DEFAULT_LIMITS, DEFAULT_MAX_REDIRECTS


def before_request(request: base_request.Request):
    url = request.url
    method = request.method

    print(url)
    print(method)


def after_request(response: base_request.Response):
    status_code = response.status_code
    content = response.read().decode("utf-8")
    print(status_code)
    print(content)


class BaseRequest:
    def __init__(self, method, url, base_url="", params=None, content=None, data=None, files=None, json=None,
                 headers=None, cookies=None, auth=None, proxies=None, timeout=DEFAULT_TIMEOUT_CONFIG,
                 follow_redirects=False, verify=True, cert=None, trust_env=True, limits: Limits = DEFAULT_LIMITS,
                 max_redirects: int = DEFAULT_MAX_REDIRECTS, ):
        # 请求方式
        self.method = method
        # 请求地址
        self.url = url
        # 请求参数,(可选)查询URL中包含的参数，可以是字符串、字典或二元组序列
        self.params = params
        # (可选)请求体中包含的二进制内容，以字节或字节迭代器的形式。
        self.content = content
        # (可选)表单数据要包含在请求体中，作为一个字典
        self.data = data
        # (可选)请求体中包含上传文件的字典。
        self.files = files
        # (可选)一个json可序列化对象，包含在请求体中。
        self.json = json
        # (可选)请求中包含的HTTP头的字典。
        self.headers = headers
        # (可选)请求中包含的Cookie条目的字典。
        self.cookies = cookies
        # (可选)发送请求时使用的认证类。
        self.auth = auth
        # (可选)一个将代理键映射到代理url的字典。
        self.proxies = proxies
        # (可选)发送请求时使用的超时配置。
        self.timeout = timeout
        # (可选)启用或禁用HTTP重定向。
        self.follow_redirects = follow_redirects
        # (可选的)SSL证书(又称CA包)用于验证被请求主机的身份。为True(默认CA包)，SSL证书文件的路径，SSL。SSLContext，或False(这将禁用验证)。
        self.verify = verify
        # (可选)被请求主机用于认证客户端的SSL证书。SSL证书文件的路径，或二元组(证书文件、密钥文件)，或三元组(证书文件、密钥文件、密码)。
        self.cert = cert
        # (可选)启用或禁用使用环境变量进行配置
        self.trust_env = trust_env

        # Client
        self.base_url = base_url
        # 限制配置使用。
        self.limits = limits
        # 重定向响应的最大数量
        self.max_redirects = max_redirects

    def request(self):
        base_request.request(method=self.method, url=self.url, params=self.params, content=self.content, data=self.data,
                             files=self.files
                             , json=self.json, headers=self.headers, cookies=self.cookies, auth=self.auth,
                             proxies=self.proxies
                             , timeout=self.timeout, follow_redirects=self.follow_redirects, verify=self.verify,
                             cert=self.cert, trust_env=self.trust_env)

    def client_request(self):
        with base_request.Client(base_url=self.base_url,
                                 event_hooks={"request": [before_request], "response": [after_request]}) as client:
            client.request(method=self.method, url=self.url, content=self.content, data=self.data,
                           files=self.files, json=self.json, params=self.params, headers=self.headers,
                           cookies=self.cookies, auth=self.auth, follow_redirects=self.follow_redirects,
                           timeout=self.timeout)

    def __del__(self):
        print("删除类")


class JsonRequest(BaseRequest):

    pass


class FileRequest(BaseRequest):
    pass


if __name__ == '__main__':
    r = BaseRequest(method="GET", base_url="http://www.baidu.com", url="s?ie=UTF-8&wd=httpx%20event_hooks")
    r.client_request()
